package com.spice.common.util;

import java.util.*;

import static com.spice.common.constant.PermissionConstant.*;

public class PermissionUtil {


    public static List<String> getRoleList() {
        return new ArrayList<>(Arrays.asList(ROLE_LIST));
    }


    public static List<String> getTableTypeList() {
        return new ArrayList<>(Arrays.asList(TABLE_TYPE_LIST));
    }


    public static List<String> getTablePermissionList() {
        return new ArrayList<>(Arrays.asList(TABLE_PERMISSION_LIST));
    }


    public static List<String> getDocTypeList() {
        return new ArrayList<>(Arrays.asList(DOC_TYPE_LIST));
    }


    public static List<String> getDocPermissionList() {
        return new ArrayList<>(Arrays.asList(DOC_PERMISSION_LIST));
    }

    /**
     * 组合权限
     *
     * @param permissionHeader 权限头
     * @param permissionBody   权限体
     * @return 权限
     */
    public static String combinePermission(String permissionHeader, String permissionBody) {
        return permissionHeader + PERMISSION_SEPARATOR + permissionBody;
    }

    /**
     * 获取所有权限
     *
     * @return 所有权限
     */
    public static Set<String> getAllPermission() {
        Set<String> allPermission = new HashSet<>();

        for (String tableType : getTableTypeList()) {
            for (String tablePermission : getTablePermissionList()) {
                // 获取所有表格权限
                allPermission.add(combinePermission(tableType, tablePermission));
            }
        }
        for (String docType : getDocTypeList()) {
            for (String docPermission : getDocPermissionList()) {
                // 获取所有文档权限
                allPermission.add(combinePermission(docType, docPermission));
            }
        }

        return allPermission;
    }


    /**
     * **产品中心：**
     * 7张表格的权限：
     * 1. 原料外形描述表
     * 2. 原料营养成分表
     * 3. 原料配料展开表
     * 4. 原料批次入场检验表（仅查看权限）
     * 5. 产品包装维护信息表
     * 6. 产品维护档案表
     * 7. 原料科研表
     * （表格详细内容见附录）
     * https://obuivy.notion.site/42be3a1cd51744dda2792358402d6338
     * 2种文档的权限：
     * 1. 学习资料文档
     * 2. 科研报告文档
     * <p>
     * 获取产品中心所有权限
     *
     * @return 所有权限
     */
    public static Set<String> getProductCenterPermission() {
        Set<String> productCenterPermission = new HashSet<>();

        for (String tableType : getTableTypeList()) {
            for (String tablePermission : getTablePermissionList()) {
                if (SOURCE_CHECK.equals(tableType)) {
                    productCenterPermission.add(combinePermission(tableType, VIEW_PERMISSION));
                } else {
                    productCenterPermission.add(combinePermission(tableType, tablePermission));
                }
            }
        }
        for (String docType : getDocTypeList()) {
            for (String docPermission : getDocPermissionList()) {
                // 获取所有文档权限
                productCenterPermission.add(combinePermission(docType, docPermission));
            }
        }

        return productCenterPermission;
    }

    /**
     * **质量中心：**
     * 仅包含1张表的权限：
     * 1. 原料批次入场检验表
     * （表格详细内容见附录）
     * https://obuivy.notion.site/42be3a1cd51744dda2792358402d6338
     * <p>
     * 获取质量中心所有权限
     *
     * @return 所有权限
     */
    public static Set<String> getQualityCenterPermission() {
        Set<String> qualityCenterPermission = new HashSet<>();

        // 获取所有原料批次入场检验表的权限
        for (String tablePermission : getTablePermissionList()) {
            qualityCenterPermission.add(combinePermission(SOURCE_CHECK, tablePermission));
        }

        return qualityCenterPermission;
    }


    /**
     * @param role 角色名
     * @return 是否为规定的角色名
     */
    public static boolean isLegalRole(String role) {
        return getRoleList().contains(role);
    }

    /**
     * @param role 角色名
     * @return 是否为规定的除root以外角色名
     */
    public static boolean isLegalRoleExceptRoot(String role) {
        if (ROOT_ROLE.equals(role)) {
            return false;
        } else {
            return getRoleList().contains(role);
        }
    }

    public static String whichDepartment(String role){
        return role.split(ROLE_SEPARATOR)[0];
    }

    public static String whichJob(String role){
        return role.split(ROLE_SEPARATOR)[1];
    }


    /**
     * **产品中心：**
     * 7张表格的权限：
     * 1. 原料外形描述表
     * 2. 原料营养成分表
     * 3. 原料配料展开表
     * 4. 原料批次入场检验表（仅查看权限）
     * 5. 产品包装维护信息表
     * 6. 产品维护档案表
     * 7. 原料科研表
     * （表格详细内容见附录）
     * https://obuivy.notion.site/42be3a1cd51744dda2792358402d6338
     * 2种文档的权限：
     * 1. 学习资料文档
     * 2. 科研报告文档
     *
     * @param permission 权限
     * @return 是否为质量中心所有的权限
     */
    public static boolean isQualityCenterPermission(String permission) {
        String[] split = permission.split(PERMISSION_SEPARATOR);
        if (split.length == 2) {
            String permissionHeader = split[0];
            String permissionBody = split[1];
            if (getTableTypeList().contains(permissionHeader)) {
                // 权限头为表格
                if (SOURCE_CHECK.equals(permissionHeader)) {
                    // 权限头为原料批次入场检验
                    return VIEW_PERMISSION.equals(permissionBody);
                } else {
                    return getTablePermissionList().contains(permissionBody);
                }
            } else if (getDocTypeList().contains(permissionHeader)) {
                // 权限头为文档
                return getDocPermissionList().contains(permissionBody);
            } else {
                // 没有找到匹配的权限头
                return false;
            }
        } else {
            // 权限格式有误
            return false;
        }
    }

    /**
     * **质量中心：**
     * 仅包含1张表的权限：
     * 1. 原料批次入场检验表
     * （表格详细内容见附录）
     * https://obuivy.notion.site/42be3a1cd51744dda2792358402d6338
     *
     * @param permission 权限
     * @return 是否为质量中心所有的权限
     */
    public static boolean isProductCenterPermission(String permission) {
        String[] split = permission.split(PERMISSION_SEPARATOR);
        if (split.length == 2) {
            String permissionHeader = split[0];
            String permissionBody = split[1];
            if (SOURCE_CHECK.equals(permissionHeader)) {
                // 权限头为原料批次入场检验
                return getTablePermissionList().contains(permissionBody);
            } else {
                // 没有找到匹配的权限头
                return false;
            }
        } else {
            // 权限格式有误
            return false;
        }
    }

    public static boolean isLegalPermission(String permission) {
        return isProductCenterPermission(permission)
                || isQualityCenterPermission(permission);
    }
}
